package com.dp.client.dto;

import java.io.Serializable;
import java.util.Date;


public class Fecha implements Comparable<Fecha>, Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	int dia, diaSemana;
	int hora;
	private static final long FACTOR = 1000L * 60L * 60L;
	public static final Fecha FECHA_ZERO_ACTUAL = new Fecha((int)(new Date(112, 0, 1).getTime() / FACTOR));
	
	public static Fecha getFechaFromDate(Date date){
		return Fecha.resta(new Fecha((int)(date.getTime() / FACTOR)), FECHA_ZERO_ACTUAL);
	}
	public Fecha(int dia, int hora){
		this.dia = dia;
		this.diaSemana = dia % 7;
		this.hora = hora;
	}
	public Fecha(int i) {
		this(i / 24, i % 24);
	}
	public Fecha() {
		this(0);
	}
	public int toHoras() {
		return dia * 24 + hora;
	}
	public int getDia(){
		return dia;
	}
	public int getHora(){
		return hora;
	}
	public static Fecha nextHora(Fecha fecha){
		int ndia = fecha.dia, nhora = fecha.hora;
		nhora++;
		if(nhora == 24){
			nhora = 0;
			ndia++;
		}
		return new Fecha(ndia, nhora);
	}
	public static Fecha nextDias(Fecha fecha, int diasAdicionales){
		return new Fecha(fecha.getDia() + diasAdicionales, fecha.getHora());
	}
	@Override
	public int compareTo(Fecha otro){
		return toHoras() - otro.toHoras();
	}
	@Override
	public boolean equals(Object otro){
		return this.compareTo((Fecha)otro) == 0;
	}
	public static Fecha getPrimeraFecha(Fecha fechaInicial, int diaDeSemana, int horaDeVuelo) {
		int dia = fechaInicial.dia / 7 * 7 + diaDeSemana;
		if(dia == fechaInicial.dia && fechaInicial.hora > horaDeVuelo)
			dia += 7;
		return new Fecha(dia, horaDeVuelo);
	}
	public void addHoras(int horas) {
		dia += horas / 24;
		hora += horas % 24;
		if(hora >= 24){
			hora -= 24;
			dia++;
		}
	}
	public int getDiaSemana() {
		return diaSemana;
	}
	public static Fecha suma(Fecha a, Fecha b) {
		int nhoras = a.hora + b.hora;
		int ndias = a.dia + b.dia;
		if(nhoras >= 24){
			ndias++;
			nhoras -= 24;
		}
		return new Fecha(ndias, nhoras);
	}
	public static Fecha resta(Fecha a, Fecha b) {
		int nhoras = a.toHoras() - b.toHoras();
		return new Fecha(nhoras);
	}
	@Override
	public String toString(){
		return dia + " " + hora;
	}
	
	public static Fecha getFechaVirtual(Fecha salida) {
		return resta(salida, FECHA_ZERO_ACTUAL);
	}
	public static Date toFechaReal(Fecha fechaVuelo) {
		Fecha real = suma(FECHA_ZERO_ACTUAL, fechaVuelo);
		Date d = new Date(real.toHoras() * FACTOR);
		return d;
	}
	public void set(Fecha fecha) {
		this.hora = fecha.hora;
		this.diaSemana = fecha.diaSemana;
		this.dia = fecha.dia;
	}
}
